{******************************************************************************}
{                                                                              }
{ Winsock2 Quality Of Service API interface Unit for Object Pascal             }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: qos.h, released June 2000. The original Pascal         }
{ code is: Qos.pas, released December 2000. The initial developer of the       }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}

// $Id: JwaQos.pas,v 1.9 2007/09/05 11:58:52 dezipaitor Exp $

{$WARNINGS OFF}
{$IFNDEF JWA_OMIT_SECTIONS}
unit JwaQos;

{$WEAKPACKAGEUNIT}

{$ENDIF JWA_OMIT_SECTIONS}

{$HPPEMIT ''}
{$HPPEMIT '#include "qos.h"'}
{$HPPEMIT ''}

{$IFNDEF JWA_OMIT_SECTIONS}
{$I jediapilib.inc}

interface

uses
  Windows;

{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_INCLUDEMODE}
type
  ULONG = Cardinal;
{$NODEFINE ULONG}
{$ENDIF JWA_INCLUDEMODE}

  //
  //  Definitions for valued-based Service Type for each direction of data flow.
  //

type
  SERVICETYPE = ULONG;
{$EXTERNALSYM SERVICETYPE}
  TServiceType = SERVICETYPE;
  PServiceType = ^TServiceType;

const
  SERVICETYPE_NOTRAFFIC = $00000000; // No data in this direction
{$EXTERNALSYM SERVICETYPE_NOTRAFFIC}
  SERVICETYPE_BESTEFFORT = $00000001; // Best Effort
{$EXTERNALSYM SERVICETYPE_BESTEFFORT}
  SERVICETYPE_CONTROLLEDLOAD = $00000002; // Controlled Load
{$EXTERNALSYM SERVICETYPE_CONTROLLEDLOAD}
  SERVICETYPE_GUARANTEED = $00000003; // Guaranteed
{$EXTERNALSYM SERVICETYPE_GUARANTEED}
  SERVICETYPE_NETWORK_UNAVAILABLE = $00000004; // Used to notify change to user
{$EXTERNALSYM SERVICETYPE_NETWORK_UNAVAILABLE}
  SERVICETYPE_GENERAL_INFORMATION = $00000005;
    // corresponds to "General Parameters" defined by IntServ
{$EXTERNALSYM SERVICETYPE_GENERAL_INFORMATION}
  SERVICETYPE_NOCHANGE = $00000006;
    // used to indicate that the flow spec contains no change from any previous one
{$EXTERNALSYM SERVICETYPE_NOCHANGE}
  SERVICETYPE_NONCONFORMING = $00000009; // Non-Conforming Traffic
{$EXTERNALSYM SERVICETYPE_NONCONFORMING}
  SERVICETYPE_NETWORK_CONTROL = $0000000A; // Network Control traffic
{$EXTERNALSYM SERVICETYPE_NETWORK_CONTROL}
  SERVICETYPE_QUALITATIVE = $0000000D; // Qualitative applications
{$EXTERNALSYM SERVICETYPE_QUALITATIVE}

  // *********  The usage of these is currently not supported.  ***************

  SERVICE_BESTEFFORT = DWORD($80010000);
{$EXTERNALSYM SERVICE_BESTEFFORT}
  SERVICE_CONTROLLEDLOAD = DWORD($80020000);
{$EXTERNALSYM SERVICE_CONTROLLEDLOAD}
  SERVICE_GUARANTEED = DWORD($80040000);
{$EXTERNALSYM SERVICE_GUARANTEED}
  SERVICE_QUALITATIVE = DWORD($80200000);
{$EXTERNALSYM SERVICE_QUALITATIVE}

  // ***************************** ***** ************************************

  //
  // Flags to control the usage of RSVP on this flow.
  //

  //
  // to turn off traffic control, 'OR' ( | ) this flag with the
  // ServiceType field in the FLOWSPEC
  //

  SERVICE_NO_TRAFFIC_CONTROL = DWORD($81000000);
{$EXTERNALSYM SERVICE_NO_TRAFFIC_CONTROL}

  //
  // this flag can be used to prevent any rsvp signaling messages from being
  // sent. Local traffic control will be invoked, but no RSVP Path messages
  // will be sent.This flag can also be used in conjunction with a receiving
  // flowspec to suppress the automatic generation of a Reserve message.
  // The application would receive notification that a Path  message had arrived
  // and would then need to alter the QOS by issuing WSAIoctl( SIO_SET_QOS ),
  // to unset this flag and thereby causing Reserve messages to go out.
  //

  SERVICE_NO_QOS_SIGNALING = $40000000;
{$EXTERNALSYM SERVICE_NO_QOS_SIGNALING}

  //
  //  Flow Specifications for each direction of data flow.
  //

type
  _flowspec = record
    TokenRate: ULONG; // In Bytes/sec
    TokenBucketSize: ULONG; // In Bytes
    PeakBandwidth: ULONG; // In Bytes/sec
    Latency: ULONG; // In microseconds
    DelayVariation: ULONG; // In microseconds
    ServiceType: SERVICETYPE;
    MaxSduSize: ULONG; // In Bytes
    MinimumPolicedSize: ULONG; // In Bytes
  end;
{$EXTERNALSYM _flowspec}
  FLOWSPEC = _flowspec;
{$EXTERNALSYM FLOWSPEC}
  PFLOWSPEC = ^FLOWSPEC;
{$EXTERNALSYM PFLOWSPEC}
  LPFLOWSPEC = ^FLOWSPEC;
{$EXTERNALSYM LPFLOWSPEC}
  TFlowSpec = FLOWSPEC;

  //
  // this value can be used in the FLOWSPEC structure to instruct the Rsvp Service
  // provider to derive the appropriate default value for the parameter.  Note
  // that not all values in the FLOWSPEC structure can be defaults. In the
  // ReceivingFlowspec, all parameters can be defaulted except the ServiceType.
  // In the SendingFlowspec, the MaxSduSize and MinimumPolicedSize can be
  // defaulted. Other defaults may be possible. Refer to the appropriate
  // documentation.
  //

const
  QOS_NOT_SPECIFIED = DWORD($FFFFFFFF);
{$EXTERNALSYM QOS_NOT_SPECIFIED}

  //
  // define a value that can be used for the PeakBandwidth, which will map into
  // positive infinity when the FLOWSPEC is converted into IntServ floating point
  // format.  We can't use (-1) because that value was previously defined to mean
  // "select the default".
  //

  POSITIVE_INFINITY_RATE = DWORD($FFFFFFFE);
{$EXTERNALSYM POSITIVE_INFINITY_RATE}

  //
  // the provider specific structure can have a number of objects in it.
  // Each next structure in the
  // ProviderSpecific will be the QOS_OBJECT_HDR struct that prefaces the actual
  // data with a type and length for that object.  This QOS_OBJECT struct can
  // repeat several times if there are several objects.  This list of objects
  // terminates either when the buffer length has been reached ( WSABUF ) or
  // an object of type QOS_END_OF_LIST is encountered.
  //

type
  QOS_OBJECT_HDR = record
    ObjectType: ULONG;
    ObjectLength: ULONG; // the length of object buffer INCLUDING this header
  end;
{$EXTERNALSYM QOS_OBJECT_HDR}
  LPQOS_OBJECT_HDR = ^QOS_OBJECT_HDR;
{$EXTERNALSYM LPQOS_OBJECT_HDR}
  TQOSObjectHdr = QOS_OBJECT_HDR;
  PQOSObjectHdr = LPQOS_OBJECT_HDR;

  //
  // general QOS objects start at this offset from the base and have a range
  // of 1000
  //

const
  QOS_GENERAL_ID_BASE = 2000;
{$EXTERNALSYM QOS_GENERAL_ID_BASE}

  QOS_OBJECT_END_OF_LIST = $00000001 + QOS_GENERAL_ID_BASE;
    // QOS_End_of_list structure passed
{$EXTERNALSYM QOS_OBJECT_END_OF_LIST}

  QOS_OBJECT_SD_MODE = $00000002 + QOS_GENERAL_ID_BASE;
    // QOS_ShapeDiscard structure passed
{$EXTERNALSYM QOS_OBJECT_SD_MODE}

  QOS_OBJECT_SHAPING_RATE = $00000003 + QOS_GENERAL_ID_BASE;
    // QOS_ShapingRate structure
{$EXTERNALSYM QOS_OBJECT_SHAPING_RATE}

  QOS_OBJECT_DESTADDR = $00000004 + QOS_GENERAL_ID_BASE;
    // QOS_DestAddr structure (defined in qossp.h)
{$EXTERNALSYM QOS_OBJECT_DESTADDR}

  //
  // This structure is used to define the behaviour that the traffic
  // control packet shaper will apply to the flow.
  //
  // TC_NONCONF_BORROW - the flow will receive resources remaining
  //  after all higher priority flows have been serviced. If a
  //  TokenRate is specified, packets may be non-conforming and
  //  will be demoted to less than best-effort priority.
  //
  // TC_NONCONF_SHAPE - TokenRate must be specified. Non-conforming
  //  packets will be retianed in the packet shaper until they become
  //  conforming.
  //
  // TC_NONCONF_DISCARD - TokenRate must be specified. Non-conforming
  //  packets will be discarded.
  //

type
  _QOS_SD_MODE = record
    ObjectHdr: QOS_OBJECT_HDR;
    ShapeDiscardMode: ULONG;
  end;
{$EXTERNALSYM _QOS_SD_MODE}
  QOS_SD_MODE = _QOS_SD_MODE;
{$EXTERNALSYM QOS_SD_MODE}
  LPQOS_SD_MODE = ^QOS_SD_MODE;
{$EXTERNALSYM LPQOS_SD_MODE}
  TQOSSDMode = QOS_SD_MODE;
  PQOSSDMode = LPQOS_SD_MODE;

const
  TC_NONCONF_BORROW = 0;
{$EXTERNALSYM TC_NONCONF_BORROW}
  TC_NONCONF_SHAPE = 1;
{$EXTERNALSYM TC_NONCONF_SHAPE}
  TC_NONCONF_DISCARD = 2;
{$EXTERNALSYM TC_NONCONF_DISCARD}
  TC_NONCONF_BORROW_PLUS = 3; // not supported currently
{$EXTERNALSYM TC_NONCONF_BORROW_PLUS}

  //
  // This structure allows an app to specify a prorated "average token rate" using by
  // the traffic shaper under SHAPE modehaper queue. It is expressed in bytes per sec.
  //
  // ShapingRate (bytes per sec.)
  //

type
  _QOS_SHAPING_RATE = record
    ObjectHdr: QOS_OBJECT_HDR;
    ShapingRate: ULONG;
  end;
{$EXTERNALSYM _QOS_SHAPING_RATE}
  QOS_SHAPING_RATE = _QOS_SHAPING_RATE;
{$EXTERNALSYM QOS_SHAPING_RATE}
  LPQOS_SHAPING_RATE = ^QOS_SHAPING_RATE;
{$EXTERNALSYM LPQOS_SHAPING_RATE}
  TQOSShapingRate = QOS_SHAPING_RATE;
  PQOSShapingRate = LPQOS_SHAPING_RATE;

{$ENDIF JWA_IMPLEMENTATIONSECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
implementation
//uses ...
{$ENDIF JWA_OMIT_SECTIONS}

{$IFNDEF JWA_INTERFACESECTION}
//your implementation here
{$ENDIF JWA_INTERFACESECTION}

{$IFNDEF JWA_OMIT_SECTIONS}
end.
{$ENDIF JWA_OMIT_SECTIONS}







